AWS SaaS Boostを触ってみる #2 Blitz.jsのサンプルアプリケーションをテナントとしてデプロイする

AWS SaaS Boostを触ってみる #2 Blitz.jsのサンプルアプリケーションをテナントとしてデプロイする

AWS SaaS Boostを使って最初のテナントアプリケーションを作成します
Clock Icon2021.06.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CX事業本部 MADチームの佐藤です。AWS SaaS Boostを触ってみる記事の2回目です。前回の記事はこちら

AWS SaaS BoostをAWSにデプロイしてログインするところまでを確認しました。今回は、実際にサンプルアプリケーションを作成しECRリポジトリにDockerイメージを置いて、1つのテナントととしてデプロイします。

AWS SaaS Boostにおけるテナントの構成

AWS SaaS Boostでは、テナントを以下のような構成でデプロイします。顧客ごとにVPC、RDSなどのリソースが独立する構成になります。このようなSaaSの構成をサイロ化モデルと言うらしいです。以下のAWS Innovateのスライドがわかりやすいです。

事業のステージに応じた SaaSの悩みと解決案

ECRのリポジトリのイメージがPushされると、各テナントへ Rolling Update を行い全てのテナントのアプリケーションが一斉に更新されます。

サンプルアプリケーションを作成する

ということで、さっそくAWS SaaS Boostにデプロイするためのサンプルアプリケーションを作成します。AWS Saas Boostがモノリスアプリケーションをターゲットにしているので、個人的に気になっているTypeScriptのフルスタックフレームワークである Blitz.js を使ってみようと思います。Blitz.jsのチュートリアルをベースに進めていきます。

https://blitzjs.com/docs/tutorial

Blitz.jsのインストール

Blitz.jsのcliをインストールします。yarnかnpmでインストールします。

yarn global add blitz

Blitz.jsプロジェクトの作成

プロジェクトを作成します。

blitz new aws-saas-boost-deploy-sample

作成したら、プロジェクトディレクトリに移動し起動することを確認します。

cd aws-saas-boost-deploy-sample
blitz dev

これでサンプルとなるアプリケーション(cliで作っただけですが...)ができましたので、AWS SaaS BoostでデプロイするためにDockerでコンテナ化をします。

Dockerでコンテナ化し、ECRにプッシュする

AWS SaaS BoostではECRリポジトリにあるイメージからテナントをデプロイするので、ECRにイメージを保存するためにDockerでコンテナ化します。ビルドしてイメージを作成します。まずは、以下のDockerfileをディレクトリのルートに作成します。これは、blitz.jsのアプリケーションをビルドし3000ポートで実行するDockerfileです。

FROM node:14-stretch-slim as base
WORKDIR /opt/app
COPY . .
RUN apt-get update && apt-get install openssl -y && rm -rf /var/lib/apt/lists/*
RUN yarn install
RUN yarn blitz prisma generate
RUN yarn build

FROM node:14-stretch-slim as prod
COPY --from=base /opt/app/package.json /opt/app/blitz.config.ts ./
COPY --from=base /opt/app/node_modules ./node_modules
COPY --from=base /opt/app/public ./public
COPY --from=base /opt/app/.blitz ./.blitz
COPY --from=base /opt/app/.next ./.next
CMD yarn start

前回の記事で AWS SaaS Boostをデプロイした際に一緒にECRもデプロイされていると思います。 sb-dev-core* からはじまるリポジトリが作成されていますので、そこにアップロードします。まずは、ECRにログインします。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com

Dockerfileをビルドします。

docker build -t aws-saas-boost-sample-app" .

ECRアップロード用のタグを付けます。ECRのリポジトリ情報は前回デプロイされた SaaS Boostの管理画面から確認できます。

docker tag aws-saas-boost-sample-app:latest xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sb-dev-core-xxxxxxxx-ecsrepository-xxxxxxxxx:latest

ECRにプッシュします。イメージのサイズが大きいので時間がかかりますが、気長に待ちます。

docker push xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sb-dev-core-xxxxxxxx-ecsrepository-xxxxxxxxx:latest

ECRにlatestタグとして登録されていることを確認します。

ECRにプッシュできましたので、次にAWS Saas Boostを使って最初のテナントを作成します。

AWS SaaS Boostの管理画面からサンプルアプリケーションをテナントとしてデプロイする

サンプルアプリケーションのイメージをECRにPushできましたので、AWS SaaS Boostを使ってテナントアプリケーションとしてデプロイしていきます。

管理画面でインフラの設定を行う

まずは、AWS Saas Boostの管理画面にログインして、 Application メニューを選択します。この画面ではテナントごとのアプリケーションインフラの設定情報を管理します。カスタムドメインの設定や、Auto Scaling、課金、DB、ファイルシステムの設定をすることができます。今回は以下のように入力しました。DBはローカルのSQLiteを使う設定なので、今回は設定しません。次回以降の記事では、データベースを考慮したテナントデプロイもやっていきます。

Application

  • Name: saas-boost-sample-app
  • Compute Size: Small
  • Container Port: 3000
  • Minimum Instance Count: 1
  • Maximum Instance Count: 2
  • Container OS: Linux
  • Health Check URL: /

ここで設定した値をもとに、CloudFormationでその顧客テナントごとのインフラがデプロイされることになります。

オンボーディングサービスを利用して、テナントを作成する

テナント作成するためには、 Onboading サービスを使用します。メニューから Onboading を選択し、右上の Provisioned Tenant をクリックします。テナントの設定画面になりますので、テナント名を入力して、Submitをクリックします。これで、さきほどの設定値に沿ったテナントアプリケーションがデプロイされます。

CloudFormationを確認するとテナント用のスタックがデプロイされているのがわかります。新しいテナントを作成すると、自動的にVPC周りの設定、ALB、ECS、RDSなどのリソースをデプロイしてくれます。

作成されたテナントリソースを確認する

Onboading サービスでのテナントのプロビジョニングが終わりました。管理画面の Tenants というメニューを開くと作成されたテナントの情報が確認できます。

上のLoad Balancer DNSをクリックしてデプロイされたアプリケーションにアクセスできました。

まとめ

サンプルアプリケーションをECRにPushし、AWS SaaS Boostの管理画面を使って、最初のテナントを作成するところまでを行いました。コンテナアプリケーションさえあれば、デプロイ自体は簡単に行えることがわかりました。次の記事では、カスタムドメインで複数のテナントをデプロイし、各テナントをサブドメインに振り分けるまでを行いたいと思います。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.